c++ - gcc 和 libstdc++ 向前兼容
全部标签 我正在尝试安装(py)caffe在ubuntu17.10上然而,当我执行makeall时,出现以下错误:./include/caffe/common.hpp(84):error:namespace"std"hasnomember"isnan"./include/caffe/common.hpp(85):error:namespace"std"hasnomember"isinf"2errorsdetectedinthecompilationof"/tmp/tmpxft_00004921_00000000-19_nesterov_solver.compute_61.cpp1.ii".Mak
我正在为LeetCode、Codeforces等编程竞赛开发一个在线评委系统。对于大多数编程竞赛,C/C++中不允许使用内联汇编程序,因此我想在我的系统中添加相同的限制。我想让GCC和G++在编译包含内联汇编的C/C++程序时产生错误,这样任何包含内联汇编的代码都会导致编译错误。有办法实现吗?我应该将一些命令行参数传递给GCC/G++吗?注意:禁用内联汇编只是为了遵守规则,而不是出于安全考虑。 最佳答案 有没有办法在GCC中禁用内联汇编程序?是的,有几种方法。在编译器中关闭汇编要在编译阶段执行此操作,请使用参数-fno-asm。但是
注意:我使用g++4.3.4版来编译我的C++代码。到目前为止,每当我想在我的代码中使用C风格的语言元素时,我似乎都可以将C的东西混合在我的C++中并与我的C++一起包含。我知道C++大部分向后兼容C...所以我想我的问题是这些:C的哪些部分与C++不向前兼容?如果我继续天真地将C的东西插入我的C++代码中,专业程序员会mock我吗?在同一个.cpp文件中包含C和C++代码的正确方法是什么?我可以继续使用g++来编译我的混合代码吗?对于这个问题,我主要关注处理单个.cpp文件和单个g++命令来编译它的解决方案。在这一点上,我真的不关心链接内容。 最佳答案
我有一个简单的内联汇编函数,它在MSVC中运行良好,但由于某种原因拒绝在AppleGCC4.2.1下运行(i386arch,强制32位模式)。幸运的是,更复杂的汇编函数可以正常工作,但是我不明白为什么这个函数不起作用...不幸的是,我无法调试它-从外观上看,XCode中没有寄存器窗口4.0.2(它是3.2版本)。我很肯定这个问题与英特尔风格的汇编无关。intConvert(doublevalue){_asm{fldvaluepusheaxfistpdwordptr[esp]popeax}//Thereturnedvalueisinsane} 最佳答案
GCC4.5.2(在Ubuntu11.10x64上,但编译为32位)生成无效的汇编代码,我很好奇是否可以在不更改代码的情况下修复,只需应用选项或类似的东西。请注意,优化已经是-O0。我有两个功能:inlinelongClass::Get(){longv=*(long*)(m_p);m_p+=4;returnv;}inlinevoidClass::Command(){m_p+=Get();}GCC4.5.2生成此汇编代码:9840m_p+=Get();f689eff5:mov0x8(%ebp),%eaxf689eff8:mov0xd4(%eax),%eaxf689effe:mov%eax
代码[GCC,使用-O2标志编译]intmain(){vector>matrixa(8);intff=5;ints=pow(ff,matrixa.size());intss=pow(double(ff),int(matrixa.size()));vector>comb(s);cout输出5^8=390624390625我想知道为什么s=390624而它应该是390625。如果我在没有-O2标志的情况下编译代码,则s=390625。此外,ss的转换似乎可以解决此问题。这是怎么回事?我的操作系统是Windows7Ultimatex64。不确定GCC版本,它带有Code::Blocks10.
我尝试使用带有优化标志-O1/-O2/-O3/-Og的gcc-5.1.0编译一个大型软件。它给了我警告-Wmaybe-uninitialized或-Wuninitialized并在运行时失败。调试后我找到了导致它的代码,但我无法理解为什么。我减少了重现失败的代码:#include#includetemplatestructfoo{templatecharbar(constU&x){//returnid(x)[0];constT&y=id(x);returny[0];}constT&id(constT&elem){returnelem;}};intmain(void){foof;char
文章中Linearvs.BinarySearch,有一个使用CMOV指令的二进制搜索的快速实现。我想在VC++中实现它,因为我正在处理的应用程序依赖于二进制搜索的性能。该实现有一些GCC内联汇编器,声明如下:staticintbinary_cmov(constint*arr,intn,intkey){intmin=0,max=n;while(min>1;asm("cmpl%3,%2\n\tcmovg%4,%0\n\tcmovle%5,%1":"+r"(min),"+r"(max):"r"(key),"g"(arr[middle]),"g"(middle+1),"g"(middle));
我目前正在为C++开发图形库,但现在遇到了一个问题,即在运行时的Debug模式下出现断言错误。我还在SO上查看了其他一些问题,但没有一个问题和答案能让我找到解决方案。在一些论坛上阅读后,我的印象是发生此错误是因为一旦vector内容更改,迭代器就会变得无效。(例如当使用erase()时)但是正如您在我的代码中看到的那样,我没有修改vector,只是迭代。错误在我用//ASSERTION标记的行中。奇怪的是,neighbor_it没有指向(*vertex_it)->neighbors()中的第一个对象,而是指向0xfeeefeee。通过代码调试时,我可以清楚地看到neighbors-ve
gcc或clang的哪些标志可以缩短编译时间?我需要启用调试功能,但可以自由禁用任何其他功能,如果它们会导致更快的编译。我知道还有很多其他方法可以缩短编译时间,但我只对这个领域感兴趣。 最佳答案 通过消除编译器完成的大部分工作(通常是优化),可以找到编译时间的最大yield。因此,不要启用优化(-O)标志。 关于c++-哪些标志将改善gcc/clang编译时间?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow